home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / arm / include / asm / floppy.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.6 KB  |  149 lines

  1. /*
  2.  *  arch/arm/include/asm/floppy.h
  3.  *
  4.  *  Copyright (C) 1996-2000 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Note that we don't touch FLOPPY_DMA nor FLOPPY_IRQ here
  11.  */
  12. #ifndef __ASM_ARM_FLOPPY_H
  13. #define __ASM_ARM_FLOPPY_H
  14. #if 0
  15. #include <mach/floppy.h>
  16. #endif
  17.  
  18. #define fd_outb(val,port)            \
  19.     do {                    \
  20.         if ((port) == FD_DOR)        \
  21.             fd_setdor((val));    \
  22.         else                \
  23.             outb((val),(port));    \
  24.     } while(0)
  25.  
  26. #define fd_inb(port)        inb((port))
  27. #define fd_request_irq()    request_irq(IRQ_FLOPPYDISK,floppy_interrupt,\
  28.                         IRQF_DISABLED,"floppy",NULL)
  29. #define fd_free_irq()        free_irq(IRQ_FLOPPYDISK,NULL)
  30. #define fd_disable_irq()    disable_irq(IRQ_FLOPPYDISK)
  31. #define fd_enable_irq()        enable_irq(IRQ_FLOPPYDISK)
  32.  
  33. static inline int fd_dma_setup(void *data, unsigned int length,
  34.                    unsigned int mode, unsigned long addr)
  35. {
  36.     set_dma_mode(DMA_FLOPPY, mode);
  37.     __set_dma_addr(DMA_FLOPPY, data);
  38.     set_dma_count(DMA_FLOPPY, length);
  39.     virtual_dma_port = addr;
  40.     enable_dma(DMA_FLOPPY);
  41.     return 0;
  42. }
  43. #define fd_dma_setup        fd_dma_setup
  44.  
  45. #define fd_request_dma()    request_dma(DMA_FLOPPY,"floppy")
  46. #define fd_free_dma()        free_dma(DMA_FLOPPY)
  47. #define fd_disable_dma()    disable_dma(DMA_FLOPPY)
  48.  
  49. /* need to clean up dma.h */
  50. #define DMA_FLOPPYDISK        DMA_FLOPPY
  51.  
  52. /* Floppy_selects is the list of DOR's to select drive fd
  53.  *
  54.  * On initialisation, the floppy list is scanned, and the drives allocated
  55.  * in the order that they are found.  This is done by seeking the drive
  56.  * to a non-zero track, and then restoring it to track 0.  If an error occurs,
  57.  * then there is no floppy drive present.       [to be put back in again]
  58.  */
  59. static unsigned char floppy_selects[2][4] =
  60. {
  61.     { 0x10, 0x21, 0x23, 0x33 },
  62.     { 0x10, 0x21, 0x23, 0x33 }
  63. };
  64.  
  65. #define fd_setdor(dor)                                \
  66. do {                                        \
  67.     int new_dor = (dor);                            \
  68.     if (new_dor & 0xf0)                            \
  69.         new_dor = (new_dor & 0x0c) | floppy_selects[fdc][new_dor & 3];    \
  70.     else                                    \
  71.         new_dor &= 0x0c;                        \
  72.     outb(new_dor, FD_DOR);                            \
  73. } while (0)
  74.  
  75. /*
  76.  * Someday, we'll automatically detect which drives are present...
  77.  */
  78. static inline void fd_scandrives (void)
  79. {
  80. #if 0
  81.     int floppy, drive_count;
  82.  
  83.     fd_disable_irq();
  84.     raw_cmd = &default_raw_cmd;
  85.     raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_SEEK;
  86.     raw_cmd->track = 0;
  87.     raw_cmd->rate = ?;
  88.     drive_count = 0;
  89.     for (floppy = 0; floppy < 4; floppy ++) {
  90.         current_drive = drive_count;
  91.         /*
  92.          * Turn on floppy motor
  93.          */
  94.         if (start_motor(redo_fd_request))
  95.             continue;
  96.         /*
  97.          * Set up FDC
  98.          */
  99.         fdc_specify();
  100.         /*
  101.          * Tell FDC to recalibrate
  102.          */
  103.         output_byte(FD_RECALIBRATE);
  104.         LAST_OUT(UNIT(floppy));
  105.         /* wait for command to complete */
  106.         if (!successful) {
  107.             int i;
  108.             for (i = drive_count; i < 3; i--)
  109.                 floppy_selects[fdc][i] = floppy_selects[fdc][i + 1];
  110.             floppy_selects[fdc][3] = 0;
  111.             floppy -= 1;
  112.         } else
  113.             drive_count++;
  114.     }
  115. #else
  116.     floppy_selects[0][0] = 0x10;
  117.     floppy_selects[0][1] = 0x21;
  118.     floppy_selects[0][2] = 0x23;
  119.     floppy_selects[0][3] = 0x33;
  120. #endif
  121. }
  122.  
  123. #define FDC1 (0x3f0)
  124.  
  125. #define FLOPPY0_TYPE 4
  126. #define FLOPPY1_TYPE 4
  127.  
  128. #define N_FDC 1
  129. #define N_DRIVE 4
  130.  
  131. #define CROSS_64KB(a,s) (0)
  132.  
  133. /*
  134.  * This allows people to reverse the order of
  135.  * fd0 and fd1, in case their hardware is
  136.  * strangely connected (as some RiscPCs
  137.  * and A5000s seem to be).
  138.  */
  139. static void driveswap(int *ints, int dummy, int dummy2)
  140. {
  141.     floppy_selects[0][0] ^= floppy_selects[0][1];
  142.     floppy_selects[0][1] ^= floppy_selects[0][0];
  143.     floppy_selects[0][0] ^= floppy_selects[0][1];
  144. }
  145.  
  146. #define EXTRA_FLOPPY_PARAMS ,{ "driveswap", &driveswap, NULL, 0, 0 }
  147.     
  148. #endif
  149.